#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define x first
#define y second
const int N=1e5+5,INF=0x7f7f7f7f;
struct node
{
    int d,v,a;
    int ms,ed;
}c[N],co[N];
int T,n,m,L,V;
int idx=0;
int p[N];
int s[N],e[N];
bool st[N];
vector<pair<int,int> >d;
bool cmp(node a,node b)
{
    return a.d<b.d;
}
int sv(int d,int v,int a)
{
    if(a==0)
    {
        if(v>V)
            return d;
        return -1;
    }
    if(a>0)
    {
        if(v>V)
            return d;
        int s=(ll)(V*V-v*v)/2/a;
        if((ll)s*2*a!=(ll)V*V-v*v)
            s++;
        if(d+s>L)
            return -1;
        return d+s;
    }
    if(a<0)
    {
        if(v<=V)
            return -1;
        return d+(ll)(V*V-v*v)/2/a;
    }
}
void trc()
{
    for(int i=1;i<=n;i++)
    {
        printf("%d %d %d %d\n",c[i].d,c[i].v,c[i].a,c[i].ms);
    }
    puts("");
}
void trco()
{
    for(int i=1;i<=idx;i++)
    {
        printf("%d %d %d %d\n",co[i].d,co[i].v,co[i].a,co[i].ms);
    }
    puts("");
}
int main()
{
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    scanf("%d",&T);
    // int tcnt=0;
    while(T--)
    {
        // tcnt++;
        idx=0;
        scanf("%d%d%d%d",&n,&m,&L,&V);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d%d",&c[i].d,&c[i].v,&c[i].a);
            c[i].ms=sv(c[i].d,c[i].v,c[i].a);
        }
        // if(tcnt==3)
        //     trc();
        for(int i=1;i<=m;i++)
            scanf("%d",&p[i]);
        p[m+1]=INF;
        for(int i=1;i<=n;i++)
        {
            if(c[i].a<0)
            {
                int k=lower_bound(p+1,p+2+m,c[i].d)-p;
                if(p[k]<=c[i].ms&&p[k]<=L)
                {
                    co[++idx]=c[i];
                    co[idx].ms=k;
                    co[idx].ed=upper_bound(p+1,p+2+m,c[i].ms)-p-1;
                }
                // if(idx==6&&tcnt==3)
                // {
                //     printf("%d %d %d %d %d\n",k,co[idx].d,co[idx].v,co[idx].a,co[idx].ms);
                // }
            }
            else if(c[i].ms!=-1)
            {
                int k=lower_bound(p+1,p+2+m,c[i].ms)-p;
                if(p[k]<=L)
                {
                    co[++idx]=c[i];
                    co[idx].ms=k;
                    co[idx].ed=m;
                }
            }
        }
        printf("%d ",idx);
        // if(tcnt==3)
        // //     trc();
        // int ans=0;
        // sort(c+1,c+1+n,cmp);
        // for(int i=1;i<=idx;i++)
        // {
        //     bool f=0;
        //     if(d.empty())
        //         d.push_back({0,0});
        //     for(int j=0;j<d.size();j++)
        //     {
        //         if(d[j].x<co[i].ms&&d[j].y>co[i].ms||d[j].x<co[i].ed&&d[j].y>co[i].ed)
        //         {
        //             d[j].x=max(d[j].x,co[i].ms),d[j].y=min(d[j].y,co[i].ed);
        //             f=1;
        //             break;
        //         }
        //     }
        //     if(!f)
        //     {
        //         d.push_back({co[i].ms,co[i].ed});
        //         ans++;
        //     }
        // }
        printf("%d\n",idx);
    }

    return 0;
}